﻿#ifndef GAME_H
#define GAME_H
#include "Direction.h"
#include "Data.h"

/*
 * class: Game
 * Summary: 对接控制器的接口
 */
class Game
{
public:
    /*
     * Function: Game
     * Summary: 有参构造函数，用于修改棋盘数据，给AI端实例化
     * Input: int** arr为外部传入二维数组的指针
     * Output: void
     */
    Game(int** arr);

    /*
     * Function: Game
     * Summary: 无参构造函数，给控制器实例化
     * Input: void
     * Output: void
     */
    Game();

    /*
     * Function: moveAI
     * Summary: 接收方向指示后进行相应的数据操作，AI端调用
     * Input: directionID为方向序号
     * Output: 返回值为移动是否成功的标志
     */
    bool moveAI(int directionID);

    /*
     * Function: move
     * Summary: 接收方向指示后进行相应的数据操作，控制端调用
     * Input: directionID为方向序号
     * Output: 返回值为移动是否成功的标志
     */
    bool move(int directionID);

    /*
     * Function: getData
     * Summary: 获取棋盘数据
     * Input: void
     * Output: 返回值为棋盘数据
     */
    int** getData();

    /*
     * Function: gameOver
     * Summary: 遍历棋盘数据，判断游戏是否结束
     * Input: void
     * Output: 返回值为游戏是否结束的标志，0-游戏未结束，1-游戏结束
     */
    bool gameOver();

    /*
     * Function: getCurrentScore
     * Summary: 获取当前的总得分
     * Input: void
     * Output: 返回值为当前的总得分
     */
    int getCurrentScore();

    /*
     * Function: getOptimalScore
     * Summary: 获取目前为止的最佳分数
     * Input: void
     * Output: 返回值为目前为止的最佳分数
     */
    int getOptimalScore();

    /*
     * Function: setOptimalScore
     * Summary: 当打开App时，由控制器调用该函数，设置最佳分数
     * Input: optimalScore为从保存文件中读取的数据
     * Output: 返回值为设置是否成功的标志
     */
    bool setOptimalScore(int optimalScore);

    /*
     * Function: restart
     * Summary: 清除棋盘数据，清除当前总分数，不清除最佳分数，重新开始游戏，随机生成两个数字
     * Input: void
     * Output: 返回值为重新开始游戏是否成功的标志
     */
    bool restart();

    /*
     * Function: getComboNumber
     * Summary: 获取成员变量comboNumber的值
     * Input: void
     * Output: 返回值为成员变量comboNumber的值
     */
    int getComboNumber();

    /*
     * Function: passGame
     * Summary: 判断是否通过游戏，即凑成2048
     * Input: void
     * Output: 返回值为游戏是否通过的标志，0-游戏未通过，1-游戏通过
     */
    bool passGame();

private:
    /*
     * Function: responseMoveAI
     * Summary: 利用多态响应方向的移动，进行数据操作，该接口不暴露
     * Input: 方向实例对象
     * Output: 返回值为响应是否成功的标志
     */
    bool responseMoveAI(Direction& direction);

    /*
     * Function: responseMove
     * Summary: 利用多态响应方向的移动，进行数据操作，该接口不暴露
     * Input: 方向实例对象
     * Output: 返回值为响应是否成功的标志
     */
    bool responseMove(Direction& direction);

    //Summary: 实例化Data对象
    Data data;

    //Summary: 实例化Up对象
    Up up;

    //Summary: 实例化Down对象
    Down down;

    //Summary: 实例化Left对象
    Left left;

    //Summary: 实例化Right对象
    Right right;

    //Summary: combo次数
    int comboNumber;
};

#endif // GAME_H
